'use strict';

const Package = require('@white-cloud-cli/package')
const log = require('@white-cloud-cli/log')
const { exec: spawn } = require('@white-cloud-cli/utils')
const path = require('path')

let pkg;
const SETTINGS = {
    // init: '@white-cloud-cli/init'
    init: '@imooc-cli/init'
}
const CACHE_DIR = 'dependencies';

async function exec() {
    // 1. targetPath -> modulePath
    // 2. modulePath -> Package(npm模块)
    // 3. Package.getRootFile(获取入口文件)
    // 4. Package.update / Package.install

    let targetPath = process.env.CLI_TARGET_PATH;
    const homePath = process.env.CLI_HOME_PATH;
    let storeDir = '';
    log.verbose('targetPath', targetPath)
    log.verbose('homePath', homePath)
    
    const cmdObj = arguments[arguments.length - 1];
    const cmdName = cmdObj.name()
    const packageName = SETTINGS[cmdName];
    const packageVersion = 'latest';

    if (!targetPath) {
        targetPath = path.resolve(homePath, CACHE_DIR); // 生成缓存路径
        storeDir = path.resolve(targetPath, 'node_modules');
        log.verbose('targetPath', targetPath);
        log.verbose('storeDir', storeDir);

        pkg = new Package({
            targetPath,
            packageName,
            packageVersion,
            storeDir
        })

        if (await pkg.exists()) {
            // 更新package
            console.log('更新package')
            await pkg.update()
        } else {
            // 安装package
            await pkg.install()
        }
    } else {
        pkg = new Package({
            targetPath,
            packageName,
            packageVersion,
        })
    }

    const rootFile = pkg.gerRootFilePath()
    if (rootFile) {
        try {
            log.verbose('rootFile', rootFile)
            // 在当前进程调用
            // require(rootFile).call(null, Array.from(arguments))
            // 在node子进程调用
            const args = Array.from(arguments);
            const cmd = args[args.length - 1]
            const o = Object.create(null);
            Object.keys(cmd).forEach(key => {
                if(cmd.hasOwnProperty(key) && !key.startsWith('_') && key !== 'parent') {
                    o[key] = cmd[key]
                }
            })
            args[args.length - 1] = o
            const code = `require('${rootFile}').call(null, ${JSON.stringify(args)})`;
            const child = spawn('node', ['-e', code], {
                cwd: process.cwd(),
                stdio: 'inherit'
            })
            child.on('error', e => {
                log.error(e.message);
                process.exit(1);
            })
            child.on('exit', e => {
                log.verbose('命令执行成功:' + e);
                process.exit(e);
            })
        } catch (e) {
            log.error(e.message);
        }
        
    }
}

module.exports = exec;
